package org.spring.aop.framework;

import com.sun.istack.internal.Nullable;

/**
 * 已配置 AOP 代理的委托接口，允许创建实际的代理对象。
 *
 * @author 李坤
 * @date 2022/4/18 10:11
 */
public interface AopProxy {

    /**
     * 创建一个新的代理对象。
     * <p>
     * 使用 AopProxy 的默认类加载器（如果需要创建代理）：通常是线程上下文类加载器。
     *
     * @return 新的代理对象（从不 {@code null}）
     *
     * @see Thread#getContextClassLoader()
     */
    Object getProxy();

    /**
     * 创建一个新的代理对象。
     * <p>
     * 使用给定的类加载器（如果需要创建代理）。
     * {@code null} 将简单地传递下去，从而导致低级代理工具的默认值，这通常与 AopProxy 实现的 {@link #getProxy()} 方法选择的默认值不同。
     *
     * @param classLoader 用于创建代理的类加载器（或 {@code null} 用于低级代理工具的默认值）
     *
     * @return 新的代理对象（从不 {@code null}）
     */
    Object getProxy(@Nullable ClassLoader classLoader);

}
